import serial

class Instrumento:
    """ 
    """
    def __init__(self):
        self.conexion = None
        self.medicion = float
        self.puerto = int
        self.velocidad = int
        self.paridad = str
        self.n_bits = int
        self.bits_parada = int

    def __str__(self):
        pass

    def set_port(self, puerto, velocidad, paridad, n_bits, bits_parada):
        self.puerto = puerto
        self.velocidad = velocidad
        self.paridad = paridad
        self.n_bits = n_bits
        self.bits_parada = bits_parada

    def get_medicion(self):
        return self.medicion

    def iniciar(self, *port):
        try:
            self.conexion = serial.Serial(port=self.puerto,
            baudrate=self.velocidad, bytesize=self.n_bits,
            parity=self.paridad, stopbits=self.bits_parada)
        except:
            print "no se pudo abrir el puerto " + str(port)

    def terminar(self):
        try:
            self.conexion.close()
        except:
            pass

    @staticmethod
    def scan_ports(self, num_ports = 20):
        """ Este metodo es una modificacion del modulo scan.py:
            (C)2002 Chris Liechti (cliechti@gmx.net)
            (C)2007 Juan Gonzalez
            LICENCIA GPL
         Devuelve una lista con todos los puertos encontrados.
         Cada elemento de la lista es una tupla con el numero del puerto
         y el del dispositivo
        """
        dispositivos_serie = []
        # Escanear num_port posibles puertos serie
        for i in range(num_ports):
            try:
        # Abrir puerto serie
                s = serial.Serial(i)
        # Si no hay errores, anadir el numero y nombre a la lista
                dispositivos_serie.append(i)
        # Cerrar puerto
                s.close()
        # Si hay un error se ignora      
            except:
                pass
        # Devolver la lista de los dispositivos serie encontrados    
        return dispositivos_serie
	
class Tesa(Instrumento):
    def __init__(self):
        self.velocidad = 1200
        self.paridad = 'E'
        self.n_bits = 7
        self.bits_parada = 2

    def leer(self):
        if self.conexion != None:
            self.medicion = self.conexion.read(13)
            return self.medicion

class Testo(Instrumento):
    def __init__(self):
        self.timeout = 1
        

    def leer(self):
        if self.conexion != None:
            self.conexion.write(bytearray.fromhex(u'12 22 11 00 00 00 00 00 00 00 00 00'))
            data = self.conexion.read(16)
            temp_h = data.encode('hex')
            self.medicion = self.hex2cen(temp_h)
            return self.medicion

    def hex2cen(self, hexa):
        """ funcion que recibe el dato que devuelve el termometro y
        devuelve la temperatura en grados centigrados
        la curva que devuelve la temperatura en grados se ajusta con
        ensayos y con los datos de calibracion del aparato
        """
        t_ref = 19.95
        value_ref = 4300703     # 'n0'
        data_f = hexa[-6:]      # 'n' desordenado en hexadecimal
        value_absh = data_f[4:6]+data_f[2:4]+data_f[0:2]    # 'n' en hexadecimal
        print value_absh
        value_abs = int('0x'+value_absh,0)  # 'n'
        print value_abs
        t = t_ref + (value_abs - value_ref)*0.00048940814   # t = t_ref + a*(n - n0)
        return t

if __name__ == '__main__':
    print 'puertos encontrados:'
    puertos = Instrumento.scan_ports(100)
    if puertos == []: print 'Ninguno'
    else:
        for i, j in puertos:
            print i, j



























	
